組込み現場の「C++」プログラミング 明日から使える徹底入門

高木 信尚(株式会社クローバーフィールド

4.3 標準ライブラリはどこまでサポートされるか?

Cと同様,C++もさまざまな実行環境で動作するプログラムを記述することができます.実際にどの程度使われているかは別として,メインフレームから8ビットマイコンまで,(4ビットマイコンのような一部の例外を除き)あらゆるコンピュータでC++プログラムを動作させることが想定されています.

もちろん,そのように実行環境が大幅に異なれば,それぞれの環境に備わっている機能もさまざまです.無理をしてすべてを共通的に扱おうとすれば,どんなに高機能な環境でも8ビットマイコンと同程度の機能しか期待することができなくなってしまいます.

そこで,C/C++では,(フルセットの)オペレーティングシステムの支援が得られるかどうかを目安に,実行環境を大きく次の2種類に分類しています.そして,実行環境がフリースタンディング環境である処理系を「フリースタンディング処理系」,実行環境がホスト環境である処理系を「ホスト処理系」と呼んでいます.

  • フリースタンディング環境(Freestanding Environment)
  • ホスト環境(Hosted Environment)

注意しないといけないのは,原文では同じであるにもかかわらず,標準C++では「自立処理系」および「依存処理系」という訳語を使用しています.ここでは,よりなじみの深い標準Cの用語である「フリースタンディング~」と「ホスト~」を使用したいと思います.

4.3.1 フリースタンディング環境

フリースタンディング環境は,オペレーティングシステムの支援を受けない実行環境です.組込み機器の多くはフリースタンディング環境に分類されます.また,オペレーティングシステムの支援がある場合でも,μITRONのようなカーネルのみで構成されるOSの場合も,やはりフリースタンディング環境に分類すべきです.

フリースタンディング環境の最大の特徴は,プログラムがmainで始まるとはかぎらない点です.プログラムの開始処理となる関数は,その名前も型も処理系定義になります.

フリースタンディング環境のもう1つの特徴は,標準ライブラリの大部分がサポートされない点です.具体的には,Cの場合,フリースタンディング環境でサポートされるライブラリは次のとおりです.

  • <float.h>
  • <iso646.h> C95
  • <limits.h>
  • <stdarg.h>
  • <stdbool.h> C99
  • <stddef.h>
  • <stdint.h> C99

このうち,右肩にC95とかC99とあるのは,そのヘッダがサポートされるようになった標準C規格のバージョンです*6.ご覧いただければわかるように,フリースタンディング環境では,型とマクロの定義以外はサポートされないことになります.

ここまではCの場合でした.ではC++はどうかというと,C++のフリースタンディング環境でサポートされるライブラリは次のとおりです.

  • <cstdarg>
  • <cstddef>
  • <cstdlib> (abort,atexit,exitのみ)
  • <exception>
  • <limits>
  • <new>
  • <typeinfo>

C++では型とマクロだけではありませんが,それ以外は,基本的な言語仕様のためのものです.また,に対応するなどがサポートされるのかも規格では明確に示されていません.

C++のセールスポイントの1つは,Cの資産をそのまま利用できる点にあります.しかし,フリースタンディング環境に関しては,これまで見てきたように,サポートされるライブラリがCとC++では異なります.そのため,たとえソースレベルであっても,サポートされるライブラリの違いが,CからC++への移行に当たっては若干の障害となります. ただ,現実的にはC++処理系はC処理系を兼ねる場合も多く,Cで使えたライブラリはC++でもそのまま使えると考えてまず問題はないでしょう.むしろ,C++で本来サポートされるはずのライブラリがサポートされないケースのほうが多く,現実に目を向けるなら,C++でもCでサポートされるライブラリを基準に考えたほうがよさそうです.

*6 C95は,「ISO/IEC 9899:1990 + ISO/IEC 9899/AMD1:1995 Amendment 1」のこと,C99は,「ISO/IEC 9899:1999」のことです.

4.3.2 ホスト環境

ホスト環境は,オペレーティングシステムの支援を受けて動作する実行環境のことです.WindowsとかLinuxなどが典型的なホスト環境に当たります.ホスト環境では,ファイルシステム,暦時間,環境変数,コマンドプロセッサといった機能の一部または全部を利用することができます.

C/C++を扱った多くの入門書や解説書は,暗黙的にホスト環境を想定しているようです.ホスト環境については資料も多いことですし,ここであえて詳しく取り上げる必要はないでしょう.